﻿using System;
using System.Windows.Forms;
using System.IO;
using System.Xml;
using Ionic.Utils.Zip;
using OOMetaExtractor;
using System.Collections.Generic;

namespace OOMetaExtractor
{
    /*Pantilla de borrado para documentos OpenOffice */
    public class OOPlantillaDeBorrado
    {
        private const int NumeroDeTipos = 18;
        public static string[,] tipos = new string[,]{
             //Tipos de metadatos                   //Valor traducido    //¿Es editable?
            {"Aplicacion generadora del documento", "",                  "True" },
            {"Asunto",                              "",                  "True" }, 
            {"Bases de datos",                      "",                  "False"},
            {"Descripcion",                         "",                  "True" },
            {"Enlaces",                             "",                  "False"},
            {"Emails",                              "",                  "False"},
            {"Estadisticas",                        "",                  "False"},
            {"Fechas",                              "",                  "False"},
            {"Impresoras",                          "",                  "False"},
            {"Informacion definida por el usuario", "",                  "True" },
            {"Lenguaje",                            "",                  "False"},
            {"Numero de ediciones",                 "",                  "True" },            
            {"Palabras clave",                      "",                  "True" },   
            {"Plantillas",                          "",                  "False"},
            {"Tiempo de edicion",                   "",                  "True" },
            {"Titulo",                              "",                  "True" },
            {"Usuarios",                            "",                  "True" },
            {"Versiones antiguas",                  "",                  "False"}};
        public bool[] seleccionado = new bool[NumeroDeTipos];
        public string[] valor = new string[NumeroDeTipos];

        public bool estaSeleccionado(string tipo)
        {
            for (int i = 0; i < OOPlantillaDeBorrado.tipos.GetLength(0); i++)
            {
                if (OOPlantillaDeBorrado.tipos[i, 0] == tipo)
                {
                    return this.seleccionado[i];
                }
            }
            throw new Exception("El tipo: " + tipo + " no existe en el vector de tipos");
        }

        public string obtenerValor(string tipo)
        {
            for (int i = 0; i < OOPlantillaDeBorrado.tipos.GetLength(0); i++)
            {
                if (OOPlantillaDeBorrado.tipos[i, 0] == tipo)
                {
                    return this.valor[i];
                }
            }
            throw new Exception("El tipo: " + tipo + " no existe en el vector de tipos");
        }
    }
    
    /*Clase estática con las funciones usadas para extraer y borrar metadatos de ficheros de open offfice*/
    public static class OODocument
    {
        public static string MSG_NOT_VALID_FILE;
        public static string MSG_ERROR_UNPACKING;
        public static string MSG_GENERATED_WITH;
        public static string MSG_OPERATING_SYSTEM;
        public static string MSG_INITIAL_CREATOR;
        public static string MSG_CREATED_BY;
        public static string MSG_PRINTED_BY;
        public static string MSG_USERS;
        public static string MSG_CREATION_DATE;
        public static string MSG_MODIFICATION_DATE;
        public static string MSG_PRINTED_DATE;
        public static string MSG_LANGUAGE;
        public static string MSG_TITLE;
        public static string MSG_SUBJECT;
        public static string MSG_DESCRIPTION;
        public static string MSG_KEYWORDS;
        public static string MSG_EDITING_CYCLES;
        public static string MSG_EDITING_DURATION;
        public static string MSG_USER_DEFINED_INFORMATION;
        public static string MSG_TEMPLATES;
        public static string MSG_STATISTICS;
        public static string MSG_TABLES;
        public static string MSG_CELLS;
        public static string MSG_IMAGES;
        public static string MSG_OBJECTS;
        public static string MSG_PAGES;
        public static string MSG_PARAGRAPHS;
        public static string MSG_WORDS;
        public static string MSG_CHARACTERS;
        public static string MSG_ERROR_PROCESS_XML;
        public static string MSG_PRINTER;
        public static string MSG_DATABASE;
        public static string MSG_FAX;
        public static string MSG_PATHS;
        public static string MSG_LINKS;
        public static string MSG_EMAILS;
        public static string MSG_OLD_VERSIONS;
        public static string MSG_COMMENT;
        public static string MSG_CREATOR;
        public static string MSG_DATE;
        public static string MSG_ERROR_CLEANING_METADATA;
        public static string MSG_METADATA_CLEANED;

        public delegate void EscribeDatos(String cadena, Object objeto);

        public static void EscribeEnListBox(String cadena, Object lb)
        {
            if (lb != null)
                ((ListBox)lb).Items.Add(cadena);
        }

        //Usado para tabular las versiones antiguas
        public static void EscribeEnListBoxRecursiva(String cadena, Object opciones)
        {
            Object[] objs = (Object[])opciones;
            ((ListBox)objs[0]).Items.Add(new String('\t', (int)objs[1]) + cadena);
        }

        public static void EscribeEnCadena(String cadena, Object sw)
        {
            ((StringWriter)sw).WriteLine("\t" + cadena);
        }

        public static void EscribeEnCadenaRecursiva(String cadena, Object opciones)
        {
            Object[] objs = (Object[])opciones;
            ((StringWriter)objs[0]).WriteLine(new String('\t', (int)objs[1]) + cadena);
        }


        public static void añadirFichero(String pathFichero, String tempFolder, Object objeto, Boolean resumen, EscribeDatos escritor, EscribeDatos escritorRecursivo)
        {
            if (Directory.Exists(tempFolder))
                Directory.Delete(tempFolder, true);
            Directory.CreateDirectory(tempFolder);
            //Copiamos el DTD, solo necesario para los documentos sxw
            if (Path.GetExtension(pathFichero) == ".sxw")
            {
                DirectoryInfo directorio = new DirectoryInfo(Path.GetFullPath(Application.StartupPath) + @"\DTD\");
                foreach (FileInfo file in directorio.GetFiles())
                {
                    file.CopyTo(tempFolder + file.Name, true);
                }
            }
            try
            {
                if (ZipFile.IsZipFile(pathFichero))
                {
                    ZipFile zip = ZipFile.Read(pathFichero);
                    zip.ExtractAll(tempFolder);
                    zip.Dispose();
                }
                else
                {
                    escritor(MSG_NOT_VALID_FILE, objeto);
                    return;
                }
            }
            catch
            {
                escritor(MSG_ERROR_UNPACKING + " " + pathFichero, objeto);
                return;
            }
            List<String> rutas = new List<String>();
            XmlDocument doc = new XmlDocument();
            if (File.Exists(tempFolder + "meta.xml"))
            {
                try
                {
                    doc.Load(tempFolder + "meta.xml");
                    XmlNodeList xnl = doc.GetElementsByTagName("meta:generator");
                    if (xnl != null && xnl.Count != 0 && xnl[0].HasChildNodes)
                    {
                        String ext = Path.GetExtension(pathFichero);
                        if (ext == ".odt" ||
                            ext == ".ods" ||
                            ext == ".odg" ||
                            ext == ".odp")
                        {
                            if (xnl[0].FirstChild.Value.IndexOf('$') != -1 && xnl[0].FirstChild.Value.IndexOf(' ') != -1 &&
                                xnl[0].FirstChild.Value.IndexOf(' ') > xnl[0].FirstChild.Value.IndexOf('$'))
                            {
                                if (!resumen) escritor(MSG_GENERATED_WITH + ": " + xnl[0].FirstChild.Value.Substring(0, xnl[0].FirstChild.Value.IndexOf('$')) + " Version: " + xnl[0].FirstChild.Value.Substring(xnl[0].FirstChild.Value.IndexOf(' ') + 1, xnl[0].FirstChild.Value.Length - xnl[0].FirstChild.Value.IndexOf(' ') - 1), objeto);
                                escritor(MSG_OPERATING_SYSTEM + ": " + xnl[0].FirstChild.Value.Substring(xnl[0].FirstChild.Value.IndexOf('$') + 1, xnl[0].FirstChild.Value.IndexOf(' ') - xnl[0].FirstChild.Value.IndexOf('$')), objeto);
                            }
                            else
                                if (!resumen) escritor(MSG_GENERATED_WITH + ": " + xnl[0].FirstChild.Value, objeto);
                        }
                        else if (ext == ".sxw")
                        {
                            if (xnl[0].FirstChild.Value.IndexOf(')') != -1 && xnl[0].FirstChild.Value.IndexOf('(') != -1 &&
                                xnl[0].FirstChild.Value.IndexOf(')') > xnl[0].FirstChild.Value.IndexOf('('))
                            {
                                if (!resumen) escritor(MSG_GENERATED_WITH + ": " + xnl[0].FirstChild.Value.Substring(0, xnl[0].FirstChild.Value.IndexOf('(')), objeto);
                                escritor(MSG_OPERATING_SYSTEM + ": " + xnl[0].FirstChild.Value.Substring(xnl[0].FirstChild.Value.IndexOf('(') + 1, xnl[0].FirstChild.Value.IndexOf(')') - xnl[0].FirstChild.Value.IndexOf('(') - 1), objeto);
                            }
                            else
                            {
                                if (!resumen) escritor(MSG_GENERATED_WITH + ": " + xnl[0].FirstChild.Value, objeto);
                            }
                        }
                    }
                    List<String> users = new List<String>();
                    xnl = doc.GetElementsByTagName("dc:initial-creator");
                    if (xnl != null && xnl.Count != 0 && xnl[0].HasChildNodes)
                        if (resumen)
                        {
                            if (!users.Contains(xnl[0].FirstChild.Value))
                                users.Add(xnl[0].FirstChild.Value);
                        }
                        else
                            escritor(MSG_INITIAL_CREATOR + ": " + xnl[0].FirstChild.Value, objeto);
                    xnl = doc.GetElementsByTagName("meta:initial-creator");
                    if (xnl != null && xnl.Count != 0 && xnl[0].HasChildNodes)
                        if (resumen)
                        {
                            if (!users.Contains(xnl[0].FirstChild.Value))
                                users.Add(xnl[0].FirstChild.Value);
                        }
                        else
                            escritor(MSG_INITIAL_CREATOR + ": " + xnl[0].FirstChild.Value, objeto);
                    xnl = doc.GetElementsByTagName("dc:creator");
                    if (xnl != null && xnl.Count != 0 && xnl[0].HasChildNodes)
                        if (resumen)
                        {
                            if (!users.Contains(xnl[0].FirstChild.Value))
                                users.Add(xnl[0].FirstChild.Value);
                        }
                        else
                            escritor(MSG_CREATED_BY + ": " + xnl[0].FirstChild.Value, objeto);
                    xnl = doc.GetElementsByTagName("meta:printed-by");
                    if (xnl != null && xnl.Count != 0 && xnl[0].HasChildNodes)
                        if (resumen)
                        {
                            if (!users.Contains(xnl[0].FirstChild.Value))
                                users.Add(xnl[0].FirstChild.Value);
                        }
                        else
                            escritor(MSG_PRINTED_BY + ": " + xnl[0].FirstChild.Value, objeto);

                    if (resumen && users.Count != 0)
                    {
                        escritor(MSG_USERS + ": ", objeto);
                        foreach (String user in users)
                            escritor("\t" + user, objeto);
                    }

                    if (!resumen)
                    {
                        xnl = doc.GetElementsByTagName("meta:creation-date");
                        if (xnl != null && xnl.Count != 0 && xnl[0].HasChildNodes)
                            escritor(MSG_CREATION_DATE + ": " + xnl[0].FirstChild.Value.Replace('T', ' '), objeto);
                        xnl = doc.GetElementsByTagName("meta:date");
                        if (xnl != null && xnl.Count != 0 && xnl[0].HasChildNodes)
                            escritor(MSG_MODIFICATION_DATE + ": " + xnl[0].FirstChild.Value.Replace('T', ' '), objeto);
                        xnl = doc.GetElementsByTagName("dc:date");
                        if (xnl != null && xnl.Count != 0 && xnl[0].HasChildNodes)
                            escritor(MSG_MODIFICATION_DATE + ": " + xnl[0].FirstChild.Value.Replace('T', ' '), objeto);
                        xnl = doc.GetElementsByTagName("meta:print-date");
                        if (xnl != null && xnl.Count != 0 && xnl[0].HasChildNodes)
                            escritor(MSG_PRINTED_DATE + ": " + xnl[0].FirstChild.Value.Replace('T', ' '), objeto);
                        xnl = doc.GetElementsByTagName("dc:language");
                        if (xnl != null && xnl.Count != 0 && xnl[0].HasChildNodes)
                            escritor(MSG_LANGUAGE + ": " + xnl[0].FirstChild.Value, objeto);
                        xnl = doc.GetElementsByTagName("dc:title");
                        if (xnl != null && xnl.Count != 0 && xnl[0].HasChildNodes)
                            escritor(MSG_TITLE + ": " + xnl[0].FirstChild.Value, objeto);
                        xnl = doc.GetElementsByTagName("dc:subject");
                        if (xnl != null && xnl.Count != 0 && xnl[0].HasChildNodes)
                            escritor(MSG_SUBJECT + ": " + xnl[0].FirstChild.Value, objeto);
                        xnl = doc.GetElementsByTagName("dc:description");
                        if (xnl != null && xnl.Count != 0 && xnl[0].HasChildNodes)
                            escritor(MSG_DESCRIPTION + ": " + xnl[0].FirstChild.Value, objeto);
                        xnl = doc.GetElementsByTagName("meta:keyword");
                        if (xnl != null && xnl.Count != 0)
                        {
                            String keyWords = "";
                            foreach (XmlNode xn in xnl)
                            {
                                if (xn.HasChildNodes)
                                {
                                    keyWords += xn.FirstChild.Value + " ";
                                }
                            }
                            escritor(MSG_KEYWORDS + ": " + keyWords, objeto);
                        }
                        xnl = doc.GetElementsByTagName("meta:editing-cycles");
                        if (xnl != null && xnl.Count != 0 && xnl[0].HasChildNodes)
                            escritor(MSG_EDITING_CYCLES + ": " + xnl[0].FirstChild.Value, objeto);
                        xnl = doc.GetElementsByTagName("meta:editing-duration");
                        if (xnl != null && xnl.Count != 0 && xnl[0].HasChildNodes)
                            escritor(MSG_EDITING_DURATION + ": " + xnl[0].FirstChild.Value.Replace('T', ' ').Replace('P', ' '), objeto);
                        xnl = doc.GetElementsByTagName("meta:user-defined");
                        if (xnl != null && xnl.Count != 0)
                        {
                            bool hayInfo = false;
                            foreach (XmlNode xn in xnl)
                            {
                                if (xn.HasChildNodes)
                                {
                                    if (!hayInfo)  //La primera vez que encontramos algún tipo de información
                                    {
                                        hayInfo = true;
                                        escritor(MSG_USER_DEFINED_INFORMATION + ":", objeto);
                                    }
                                    escritor("\t" + xn.Attributes.GetNamedItem("meta:name").Value + ": " + xn.FirstChild.Value, objeto);
                                }
                            }
                        }
                    }
                    xnl = doc.GetElementsByTagName("meta:template");
                    if (xnl != null && xnl.Count != 0)
                    {
                        if (!resumen)escritor(MSG_TEMPLATES + ": ", objeto);
                        foreach (XmlNode xn in xnl)
                        {
                            if (resumen)
                            {
                                if (!rutas.Contains(Funciones.LimpiaRuta(xn.Attributes.GetNamedItem("xlink:href").Value)))
                                    rutas.Add(Funciones.LimpiaRuta(xn.Attributes.GetNamedItem("xlink:href").Value));
                            }
                            else
                                escritor("\t" + xn.Attributes.GetNamedItem("xlink:href").Value, objeto);
                        }
                    }
                    if (!resumen)
                    {
                        xnl = doc.GetElementsByTagName("meta:document-statistic");
                        if (xnl != null)
                        {
                            escritor(MSG_STATISTICS + ":", objeto);
                            if (xnl[0].Attributes.GetNamedItem("meta:table-count") != null)
                                escritor("\t" + MSG_TABLES + ": " + xnl[0].Attributes.GetNamedItem("meta:table-count").Value, objeto);
                            if (xnl[0].Attributes.GetNamedItem("meta:cell-count") != null)
                                escritor("\t" + MSG_CELLS + ": " + xnl[0].Attributes.GetNamedItem("meta:cell-count").Value, objeto);
                            if (xnl[0].Attributes.GetNamedItem("meta:image-count") != null)
                                escritor("\t" + MSG_IMAGES + ": " + xnl[0].Attributes.GetNamedItem("meta:image-count").Value, objeto);
                            if (xnl[0].Attributes.GetNamedItem("meta:object-count") != null)
                                escritor("\t" + MSG_OBJECTS + ": " + xnl[0].Attributes.GetNamedItem("meta:object-count").Value, objeto);
                            if (xnl[0].Attributes.GetNamedItem("meta:page-count") != null)
                                escritor("\t" + MSG_PAGES + ": " + xnl[0].Attributes.GetNamedItem("meta:page-count").Value, objeto);
                            if (xnl[0].Attributes.GetNamedItem("meta:paragraph-count") != null)
                                escritor("\t" + MSG_PARAGRAPHS + ": " + xnl[0].Attributes.GetNamedItem("meta:paragraph-count").Value, objeto);
                            if (xnl[0].Attributes.GetNamedItem("meta:word-count") != null)
                                escritor("\t" + MSG_WORDS + ": " + xnl[0].Attributes.GetNamedItem("meta:word-count").Value, objeto);
                            if (xnl[0].Attributes.GetNamedItem("meta:character-count") != null)
                                escritor("\t" + MSG_CHARACTERS + ": " + xnl[0].Attributes.GetNamedItem("meta:character-count").Value, objeto);
                        }
                    }
                }
                catch
                {
                    escritor(MSG_ERROR_PROCESS_XML + " " + pathFichero, objeto);
                    return;
                }
            }
            if (File.Exists(tempFolder + "settings.xml"))
            {
                try
                {
                    doc.Load(tempFolder + "settings.xml");
                    XmlNodeList xnl = doc.GetElementsByTagName("config:config-item");
                    if (xnl != null)
                    {
                        foreach (XmlNode xn in xnl)
                        {
                            if (xn.Attributes.GetNamedItem("config:name").Value == "PrinterName")
                            {
                                if (xn.HasChildNodes)
                                    escritor(MSG_PRINTER + ": " + xn.FirstChild.Value, objeto);
                            }
                            else if (xn.Attributes.GetNamedItem("config:name").Value == "CurrentDatabaseDataSource")
                            {
                                if (xn.HasChildNodes)
                                    escritor(MSG_DATABASE + ": " + xn.FirstChild.Value, objeto);
                            }
                            else if (xn.Attributes.GetNamedItem("config:name").Value == "PrintFaxName")
                            {
                                if (xn.HasChildNodes)
                                    escritor(MSG_FAX + ": " + xn.FirstChild.Value, objeto);
                            }
                            else if (xn.Attributes.GetNamedItem("config:name").Value == "CurrentDatabaseCommandType")
                            {
                                if (!resumen)
                                    if (xn.HasChildNodes && xn.FirstChild.Value != "0")
                                        escritor("Current Database Command Type: " + xn.FirstChild.Value, objeto);
                            }
                            else if (xn.Attributes.GetNamedItem("config:name").Value == "CurrentDatabaseCommand")
                            {
                                if (!resumen)
                                    if (xn.HasChildNodes)
                                        escritor("Current Database Command: " + xn.FirstChild.Value, objeto);
                            }
                            //Solo aparecen en ficheros ODP y ODG file:///
                            else if (xn.Attributes.GetNamedItem("config:name").Value == "ColorTableURL")
                            {
                                if (xn.HasChildNodes)
                                    if (Funciones.LimpiaRuta(xn.FirstChild.Value) != "$(user)/config/" &&
                                        !rutas.Contains(Funciones.LimpiaRuta(xn.FirstChild.Value)))
                                        rutas.Add(Funciones.LimpiaRuta(xn.FirstChild.Value));
                            }
                            else if (xn.Attributes.GetNamedItem("config:name").Value == "BitmapTableURL")
                            {
                                if (xn.HasChildNodes)
                                    if (Funciones.LimpiaRuta(xn.FirstChild.Value) != "$(user)/config/" &&
                                        !rutas.Contains(Funciones.LimpiaRuta(xn.FirstChild.Value)))
                                        rutas.Add(Funciones.LimpiaRuta(xn.FirstChild.Value));
                            }
                            else if (xn.Attributes.GetNamedItem("config:name").Value == "DashTableURL")
                            {
                                if (xn.HasChildNodes)
                                    if (Funciones.LimpiaRuta(xn.FirstChild.Value) != "$(user)/config/" &&
                                        !rutas.Contains(Funciones.LimpiaRuta(xn.FirstChild.Value)))
                                        rutas.Add(Funciones.LimpiaRuta(xn.FirstChild.Value));
                            }
                            else if (xn.Attributes.GetNamedItem("config:name").Value == "GradientTableURL")
                            {
                                if (xn.HasChildNodes)
                                    if (Funciones.LimpiaRuta(xn.FirstChild.Value) != "$(user)/config/" &&
                                        !rutas.Contains(Funciones.LimpiaRuta(xn.FirstChild.Value)))
                                        rutas.Add(Funciones.LimpiaRuta(xn.FirstChild.Value));
                            }
                            else if (xn.Attributes.GetNamedItem("config:name").Value == "HatchTableURL")
                            {
                                if (xn.HasChildNodes)
                                    if (Funciones.LimpiaRuta(xn.FirstChild.Value) != "$(user)/config/" &&
                                        !rutas.Contains(Funciones.LimpiaRuta(xn.FirstChild.Value)))
                                        rutas.Add(Funciones.LimpiaRuta(xn.FirstChild.Value));
                            }
                            else if (xn.Attributes.GetNamedItem("config:name").Value == "LineEndTableURL")
                            {
                                if (xn.HasChildNodes)
                                    if (Funciones.LimpiaRuta(xn.FirstChild.Value) != "$(user)/config/" &&
                                        !rutas.Contains(Funciones.LimpiaRuta(xn.FirstChild.Value)))
                                        rutas.Add(Funciones.LimpiaRuta(xn.FirstChild.Value));
                            }
                        }
                    }
                }
                catch
                {
                    escritor(MSG_ERROR_PROCESS_XML + " " + pathFichero, objeto);
                    return;
                }
            }
            if (rutas.Count > 0)
            {
                escritor(MSG_PATHS + ":", objeto);
                foreach (string ruta in rutas)
                {
                    escritor("\t" + ruta, objeto);
                }
            }
            if (!resumen && File.Exists(tempFolder + "content.xml"))
            {
                try
                {
                    doc.Load(tempFolder + "content.xml");
                    /*Busca enlaces dentro del documento*/
                    XmlNodeList xnl = doc.GetElementsByTagName("text:a");
                    if (xnl != null)
                    {
                        List<String> links = new List<String>();
                        List<String> emails = new List<String>();
                        foreach (XmlNode xn in xnl)
                        {
                            String href = xn.Attributes.GetNamedItem("xlink:href").Value;
                            if (href != "")
                            {
                                if (href.StartsWith("mailto:"))
                                {
                                    String email = href.Substring(7, (href.Contains("?") ? href.IndexOf('?') : href.Length) - 7);
                                    if (!emails.Contains(email))
                                        emails.Add(email);
                                }
                                else
                                {
                                    try
                                    {
                                        Uri u = new Uri(href);
                                        if (u.HostNameType != UriHostNameType.Dns)
                                        {
                                            if (!links.Contains(href))
                                                links.Add(href);
                                        }
                                    }
                                    catch (UriFormatException)  //No es una URI, será un path interno...
                                    {
                                        if (!href.StartsWith("#"))  //Se omiten referencias del tipo #Pais
                                        {
                                            if (!links.Contains(href))
                                                links.Add(href);
                                        }
                                    }
                                }
                            }
                        }
                        if (links.Count != 0)
                        {
                            escritor(MSG_LINKS + ": ", objeto);
                            foreach (String link in links)
                            {
                                escritor("\t" + link, objeto);
                            }
                        }
                        if (emails.Count != 0)
                        {
                            escritor(MSG_EMAILS + ": ", objeto);
                            foreach (String email in emails)
                            {
                                escritor("\t" + email, objeto);
                            }
                        }
                    }
                }
                catch
                {
                    escritor(MSG_ERROR_PROCESS_XML + " " + pathFichero, objeto);
                    return;
                }
            }
            if (File.Exists(tempFolder + "VersionList.xml"))
            {
                try
                {
                    doc.Load(tempFolder + "VersionList.xml");
                    XmlNodeList xnl = doc.GetElementsByTagName("VL:version-entry");
                    if (xnl != null && xnl.Count != 0)
                    {
                        escritor(MSG_OLD_VERSIONS + ": ", objeto);
                        foreach (XmlNode xn in xnl)
                        {
                            escritor("\t" + xn.Attributes["VL:title"].Value, objeto);
                            escritor("\t" + MSG_COMMENT + ": " + xn.Attributes["VL:comment"].Value, objeto);
                            escritor("\t" + MSG_CREATOR + ": " + xn.Attributes["VL:creator"].Value, objeto);
                            escritor("\t" + MSG_DATE + ": " + xn.Attributes["dc:date-time"].Value.Replace('T', ' '), objeto);
                            if (File.Exists(tempFolder + "Versions\\" + xn.Attributes["VL:title"].Value))
                            {
                                String VersionAntigua = tempFolder + "Versions\\" + xn.Attributes["VL:title"].Value;
                                File.Move(VersionAntigua, VersionAntigua + Path.GetExtension(pathFichero));
                                OODocument.añadirFichero(VersionAntigua + Path.GetExtension(pathFichero), VersionAntigua + "Temp\\", new Object[] { objeto, 2 }, resumen, escritorRecursivo, escritorRecursivo);
                            }
                        }
                    }
                }
                catch
                {
                    escritor(MSG_ERROR_PROCESS_XML + " " + pathFichero, objeto);
                    return;
                }
            }
            Directory.Delete(tempFolder, true);
        }

        public static void borrarMetadatosDeFichero(String pathFichero, String tempFolder, OOPlantillaDeBorrado plantilla, Object objeto, EscribeDatos escritor)
        {
            if (Directory.Exists(tempFolder))
                Directory.Delete(tempFolder, true);
            Directory.CreateDirectory(tempFolder);
            if (Path.GetExtension(pathFichero) == ".sxw")
            {
                DirectoryInfo directorioDTD = new DirectoryInfo(Path.GetFullPath(Application.StartupPath) + @"\DTD\");
                foreach (FileInfo file in directorioDTD.GetFiles())
                {
                    file.CopyTo(tempFolder + file.Name, true);
                }
            }
            //Extrae todos los ficheros a la carpeta temp
            try
            {
                if (ZipFile.IsZipFile(pathFichero))
                {
                    ZipFile zip = ZipFile.Read(pathFichero);
                    zip.ExtractAll(tempFolder);
                    zip.Dispose();
                }
                else
                {
                    escritor(MSG_NOT_VALID_FILE, objeto);
                    return;
                }
            }
            catch
            {
                escritor(MSG_ERROR_UNPACKING, objeto);
                return;
            }
            //Modifica el meta.xml
            XmlDocument doc = new XmlDocument();
            if (File.Exists(tempFolder + "meta.xml"))
            {
                try
                {
                    doc.Load(tempFolder + "meta.xml");
                    XmlNodeList xnl;
                    if (plantilla.estaSeleccionado("Aplicacion generadora del documento"))
                    {
                        xnl = doc.GetElementsByTagName("meta:generator");
                        if (xnl != null && xnl.Count != 0 && xnl[0].HasChildNodes)
                            xnl[0].FirstChild.Value = plantilla.obtenerValor("Aplicacion generadora del documento");
                    }
                    if (plantilla.estaSeleccionado("Usuarios"))
                    {
                        xnl = doc.GetElementsByTagName("dc:initial-creator");
                        if (xnl != null && xnl.Count != 0 && xnl[0].HasChildNodes)
                            xnl[0].FirstChild.Value = plantilla.obtenerValor("Usuarios");
                        xnl = doc.GetElementsByTagName("meta:initial-creator");
                        if (xnl != null && xnl.Count != 0 && xnl[0].HasChildNodes)
                            xnl[0].FirstChild.Value = plantilla.obtenerValor("Usuarios");
                        xnl = doc.GetElementsByTagName("dc:creator");
                        if (xnl != null && xnl.Count != 0 && xnl[0].HasChildNodes)
                            xnl[0].FirstChild.Value = plantilla.obtenerValor("Usuarios");
                        xnl = doc.GetElementsByTagName("meta:printed-by");
                        if (xnl != null && xnl.Count != 0 && xnl[0].HasChildNodes)
                            xnl[0].FirstChild.Value = plantilla.obtenerValor("Usuarios");
                    }
                    if (plantilla.estaSeleccionado("Fechas"))
                    {
                        xnl = doc.GetElementsByTagName("meta:creation-date");
                        if (xnl != null && xnl.Count != 0 && xnl[0].HasChildNodes)
                            xnl[0].FirstChild.Value = "";
                        xnl = doc.GetElementsByTagName("meta:date");
                        if (xnl != null && xnl.Count != 0 && xnl[0].HasChildNodes)
                            xnl[0].FirstChild.Value = "";
                        xnl = doc.GetElementsByTagName("dc:date");
                        if (xnl != null && xnl.Count != 0 && xnl[0].HasChildNodes)
                            xnl[0].FirstChild.Value = "";
                        xnl = doc.GetElementsByTagName("meta:print-date");
                        if (xnl != null && xnl.Count != 0 && xnl[0].HasChildNodes)
                            xnl[0].FirstChild.Value = "";
                    }
                    if (plantilla.estaSeleccionado("Lenguaje"))
                    {
                        xnl = doc.GetElementsByTagName("dc:language");
                        if (xnl != null && xnl.Count != 0 && xnl[0].HasChildNodes)
                            xnl[0].FirstChild.Value = "";
                    }
                    if (plantilla.estaSeleccionado("Titulo"))
                    {
                        xnl = doc.GetElementsByTagName("dc:title");
                        if (xnl != null && xnl.Count != 0 && xnl[0].HasChildNodes)
                            xnl[0].FirstChild.Value = plantilla.obtenerValor("Titulo");
                    }
                    if (plantilla.estaSeleccionado("Asunto"))
                    {
                        xnl = doc.GetElementsByTagName("dc:subject");
                        if (xnl != null && xnl.Count != 0 && xnl[0].HasChildNodes)
                            xnl[0].FirstChild.Value = plantilla.obtenerValor("Asunto");
                    }
                    if (plantilla.estaSeleccionado("Descripcion"))
                    {
                        xnl = doc.GetElementsByTagName("dc:description");
                        if (xnl != null && xnl.Count != 0 && xnl[0].HasChildNodes)
                            xnl[0].FirstChild.Value = plantilla.obtenerValor("Descripcion");
                    }
                    if (plantilla.estaSeleccionado("Palabras clave"))
                    {
                        xnl = doc.GetElementsByTagName("meta:keyword");
                        if (xnl != null && xnl.Count != 0)
                            foreach (XmlNode xn in xnl)
                                if (xn.HasChildNodes)
                                    xn.FirstChild.Value = plantilla.obtenerValor("Palabras clave");
                    }
                    if (plantilla.estaSeleccionado("Numero de ediciones"))
                    {
                        xnl = doc.GetElementsByTagName("meta:editing-cycles");
                        if (xnl != null && xnl.Count != 0 && xnl[0].HasChildNodes)
                            xnl[0].FirstChild.Value = plantilla.obtenerValor("Numero de ediciones");
                    }
                    if (plantilla.estaSeleccionado("Tiempo de edicion"))
                    {
                        xnl = doc.GetElementsByTagName("meta:editing-duration");
                        if (xnl != null && xnl.Count != 0 && xnl[0].HasChildNodes)
                            xnl[0].FirstChild.Value = plantilla.obtenerValor("Tiempo de edicion");
                    }
                    if (plantilla.estaSeleccionado("Informacion definida por el usuario"))
                    {
                        xnl = doc.GetElementsByTagName("meta:user-defined");
                        if (xnl != null && xnl.Count != 0)
                        {
                            foreach (XmlNode xn in xnl)
                            {
                                if (xn.HasChildNodes)
                                {
                                    xn.FirstChild.Value = plantilla.obtenerValor("Informacion definida por el usuario");
                                }
                            }
                        }
                    }
                    if (plantilla.estaSeleccionado("Plantillas"))
                    {
                        xnl = doc.GetElementsByTagName("meta:template");
                        if (xnl != null && xnl.Count != 0)
                            foreach (XmlNode xn in xnl)
                                xn.Attributes.GetNamedItem("xlink:href").Value = "";
                    }
                    if (plantilla.estaSeleccionado("Estadisticas"))
                    {
                        xnl = doc.GetElementsByTagName("meta:document-statistic");
                        if (xnl != null && xnl.Count != 0)
                        {
                            if (xnl[0].Attributes.GetNamedItem("meta:table-count") != null)
                                xnl[0].Attributes.GetNamedItem("meta:table-count").Value = "0";
                            if (xnl[0].Attributes.GetNamedItem("meta:cell-count") != null)
                                xnl[0].Attributes.GetNamedItem("meta:cell-count").Value = "0";
                            if (xnl[0].Attributes.GetNamedItem("meta:image-count") != null)
                                xnl[0].Attributes.GetNamedItem("meta:image-count").Value = "0";
                            if (xnl[0].Attributes.GetNamedItem("meta:object-count") != null)
                                xnl[0].Attributes.GetNamedItem("meta:object-count").Value = "0";
                            if (xnl[0].Attributes.GetNamedItem("meta:page-count") != null)
                                xnl[0].Attributes.GetNamedItem("meta:page-count").Value = "0";
                            if (xnl[0].Attributes.GetNamedItem("meta:paragraph-count") != null)
                                xnl[0].Attributes.GetNamedItem("meta:paragraph-count").Value = "0";
                            if (xnl[0].Attributes.GetNamedItem("meta:word-count") != null)
                                xnl[0].Attributes.GetNamedItem("meta:word-count").Value = "0";
                            if (xnl[0].Attributes.GetNamedItem("meta:character-count") != null)
                                xnl[0].Attributes.GetNamedItem("meta:character-count").Value = "0";
                        }
                    }
                    doc.Save(tempFolder + "meta.xml");
                }
                catch
                {
                    escritor(MSG_ERROR_PROCESS_XML + " " + pathFichero, objeto);
                    return;
                }
            }

            if (File.Exists(tempFolder + "settings.xml"))
            {
                try
                {
                    doc.Load(tempFolder + "settings.xml");
                    XmlNodeList xnl = doc.GetElementsByTagName("config:config-item");
                    foreach (XmlNode xn in xnl)
                    {
                        if (xn.Attributes.GetNamedItem("config:name").Value == "PrinterName" && plantilla.estaSeleccionado("Impresoras"))
                        {
                            if (xn.HasChildNodes)
                                xn.FirstChild.Value = "";
                        }
                        else if (xn.Attributes.GetNamedItem("config:name").Value == "PrintFaxName" && plantilla.estaSeleccionado("Impresoras"))
                        {
                            if (xn.HasChildNodes)
                                xn.FirstChild.Value = "";
                        }
                        else if (xn.Attributes.GetNamedItem("config:name").Value == "CurrentDatabaseDataSource" && plantilla.estaSeleccionado("Bases de datos"))
                        {
                            if (xn.HasChildNodes)
                                xn.FirstChild.Value = "";
                        }
                        else if (xn.Attributes.GetNamedItem("config:name").Value == "CurrentDatabaseCommandType" && plantilla.estaSeleccionado("Bases de datos"))
                        {
                            if (xn.HasChildNodes)
                                xn.FirstChild.Value = "";
                        }
                        else if (xn.Attributes.GetNamedItem("config:name").Value == "CurrentDatabaseCommand" && plantilla.estaSeleccionado("Bases de datos"))
                        {
                            if (xn.HasChildNodes)
                                xn.FirstChild.Value = "";
                        }
                        //Solo aparecen en ficheros ODP y ODG file:///
                        else if (xn.Attributes.GetNamedItem("config:name").Value == "ColorTableURL")
                        {
                            if (xn.HasChildNodes)
                                xn.FirstChild.Value = "";
                        }
                        else if (xn.Attributes.GetNamedItem("config:name").Value == "BitmapTableURL")
                        {
                            if (xn.HasChildNodes)
                                xn.FirstChild.Value = "";
                        }
                        else if (xn.Attributes.GetNamedItem("config:name").Value == "DashTableURL")
                        {
                            if (xn.HasChildNodes)
                                xn.FirstChild.Value = "";
                        }
                        else if (xn.Attributes.GetNamedItem("config:name").Value == "GradientTableURL")
                        {
                            if (xn.HasChildNodes)
                                xn.FirstChild.Value = "";
                        }
                        else if (xn.Attributes.GetNamedItem("config:name").Value == "HatchTableURL")
                        {
                            if (xn.HasChildNodes)
                                xn.FirstChild.Value = "";
                        }
                        else if (xn.Attributes.GetNamedItem("config:name").Value == "LineEndTableURL")
                        {
                            if (xn.HasChildNodes)
                                xn.FirstChild.Value = "";
                        }
                    }
                    doc.Save(tempFolder + "settings.xml");
                }
                catch
                {
                    escritor(MSG_ERROR_PROCESS_XML + " " + pathFichero, objeto);
                    return;
                }
            }

            if (File.Exists(tempFolder + "content.xml"))
            {
                try
                {
                    doc.Load(tempFolder + "content.xml");
                    XmlNodeList xnl = doc.GetElementsByTagName("text:a");
                    if (xnl != null)
                    {
                        foreach (XmlNode xn in xnl)
                        {
                            String href = xn.Attributes.GetNamedItem("xlink:href").Value;
                            if (href != "")
                            {
                                if (href.StartsWith("mailto:"))
                                {
                                    if (plantilla.estaSeleccionado("Emails"))
                                    {
                                        xn.Attributes.GetNamedItem("xlink:href").Value = "";
                                    }
                                }
                                else
                                {
                                    try
                                    {
                                        Uri u = new Uri(href);
                                        if (u.HostNameType != UriHostNameType.Dns)
                                        {
                                            if (plantilla.estaSeleccionado("Enlaces"))
                                            {
                                                xn.Attributes.GetNamedItem("xlink:href").Value = "";
                                            }
                                        }
                                    }
                                    catch (UriFormatException)  //No es una URI, será un path interno...
                                    {
                                        if (!href.StartsWith("#"))  //Se omiten referencias del tipo #Pais
                                        {
                                            if (plantilla.estaSeleccionado("Enlaces"))
                                            {
                                                xn.Attributes.GetNamedItem("xlink:href").Value = "";
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                    doc.Save(tempFolder + "content.xml");
                }
                catch
                {
                    escritor(MSG_ERROR_PROCESS_XML + " " + pathFichero, objeto);
                    return;
                }
            }
            if (plantilla.estaSeleccionado("Versiones antiguas"))
            {
                if (File.Exists(tempFolder + "VersionList.xml"))
                    File.Delete(tempFolder + "VersionList.xml");
                if(Directory.Exists(tempFolder + "Versions\\"))
                    Directory.Delete(tempFolder + "Versions\\", true);
            }
            try
            {
                //Borra el fichero original
                File.Delete(pathFichero);
                //Borramos los dtd y mod que hemos copiado a temp
                DirectoryInfo directorio = new DirectoryInfo(tempFolder);
                foreach (FileInfo file in directorio.GetFiles())
                {
                    if (file.Extension.ToLower() == ".dtd" || file.Extension.ToLower() == ".mod")
                        file.Delete();
                }
                ZipFile zip = new ZipFile(pathFichero);
                foreach (String file in Directory.GetFiles(tempFolder, "*", SearchOption.AllDirectories))
                {
                    zip.AddFile(file, file.Substring(tempFolder.Length, file.Length - tempFolder.Length - Path.GetFileName(file).Length));
                }
                zip.Save();
                zip.Dispose();
            }
            catch (Exception e)
            {
                escritor(MSG_ERROR_CLEANING_METADATA + e.ToString(), objeto);
                return;
            }
            escritor(MSG_METADATA_CLEANED, objeto);
        }
    }
}
